home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 004 / pctouch.arc / PC-TOUCH.BAS (.txt) next >
Encoding:
GW-BASIC  |  1980-01-01  |  9.6 KB  |  404 lines

  1. 100  '
  2. 200  ' PC-TOUCH ---- Program to help you practice touch-typing,
  3. 300  '                     by Dean Hannotte (July, 1983).
  4. 400  '
  5. 500  '         This program has been given free of charge and "as is" to the
  6. 600  '    New York IBM Personal Computer User Group. Please share it with as
  7. 700  '    many people as you like. If you'd like to request enhancements, or
  8. 800  '    just want to talk about it, I can be reached at (212) 674-5848 be-
  9. 900  '    tween 9AM and 9PM.
  10. 1000  '
  11. 1100  '         I also do contract programming.
  12. 1200  '
  13. 1300  ' Constants:
  14. 1400  '
  15. 1500  Y = -1 : N = 0<UNK! {0009}><UNK! {0009}><UNK! {0009}>    'Logical variables
  16. 1600  ENTER$ = CHR$(17)+CHR$(196)+CHR$(217)  'Picture of ENTER key
  17. 1700  ESC$ = "ESC"                           'Picture of ESC key
  18. 1800  F1$ = "F1"                             'Picture of F1 key
  19. 1900  '
  20. 2000  CR$     = CHR$(13) <UNK! {0009}><UNK! {0009}>    'Carriage return character
  21. 2100  CURSOR$ = CHR$(95) <UNK! {0009}><UNK! {0009}>    'Cursor character
  22. 2200  '
  23. 2300  ' System Variables:
  24. 2400  '
  25. 2500  TRACE = N<UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}>   'Display critical variables?
  26. 2600  '
  27. 2700  ' Execution-time Parameters:
  28. 2800  '
  29. 2900  NO.SOUND = N<UNK! {0009}><UNK! {0009}><UNK! {0009}>   'Silent operation?
  30. 3000  NO.MUSIC = Y<UNK! {0009}><UNK! {0009}><UNK! {0009}>   'Musical keyboard?
  31. 3100  'COLOR Foreground/Background settings for all monitor types:
  32. 3200  WHITE = 7
  33. 3300  BLACK = 0
  34. 3400  HILIT = 8<UNK! {0009}><UNK! {0009}><UNK! {0009}><UNK! {0009}>   'Add this to foreground white only
  35. 3500  BLINK = 16 <UNK! {0009}><UNK! {0009}><UNK! {0009}>   'Add this to foreground white only
  36. 3600  GOTO 14600 'Branch around subroutines
  37. 3700  '
  38. 3800  ' Wait for Keystroke Subroutine:
  39. 3900  '
  40. 4000  INK$ = INKEY$
  41. 4100  IF INK$ <> "" GOTO 4600
  42. 4200  COLOR BLACK,WHITE
  43. 4300  LOCATE 22,37
  44. 4400  PRINT TIME$;
  45. 4500  GOTO 4000
  46. 4600  IF LEN(INK$) = 2 GOTO 5200 <UNK! {0009}><UNK! {0009}>'Special key hit
  47. 4700  IF INK$ = CR$ GOTO 5100<UNK! {0009}><UNK! {0009}><UNK! {0009}>'ENTER key hit
  48. 4800  IF ASC(INK$) = 27 GOTO 35300<UNK! {0009}><UNK! {0009}>'ESC key hit
  49. 4900  IF ASC(INK$) < 32 GOTO 4000<UNK! {0009}><UNK! {0009}>'Ignore control characters
  50. 5000  IF ASC(INK$) > 126 GOTO 4000<UNK! {0009}><UNK! {0009}>'
  51. 5100  RETURN
  52. 5200  IF ASC(RIGHT$(INK$,1)) = 59 GOTO 5400<UNK! {0009}>'F1 key hit
  53. 5300  GOTO 4000
  54. 5400  IF NOT HALTABLE GOTO 4000
  55. 5500  HALT.HH = VAL(LEFT$(TIME$,2))
  56. 5600  HALT.MM = VAL(MID$(TIME$,4,2))
  57. 5700  HALT.SS = VAL(RIGHT$(TIME$,2))
  58. 5800  LOCATE 20,34
  59. 5900  COLOR BLACK+BLINK,WHITE
  60. 6000  PRINT F1$;
  61. 6100  IF NOT TRACE GOTO 6500
  62. 6200  LOCATE 21,52
  63. 6300  COLOR WHITE,BLACK
  64. 6400  PRINT "H:" HALT.HH HALT.MM HALT.SS;
  65. 6500  INK$ = INKEY$
  66. 6600  IF INK$ <> "" GOTO 7100
  67. 6700  LOCATE 22,37
  68. 6800  COLOR BLACK,WHITE
  69. 6900  PRINT TIME$;
  70. 7000  GOTO 6500
  71. 7100  IF LEN(INK$) <> 2 GOTO 6500
  72. 7200  IF ASC(RIGHT$(INK$,1)) <> 59 GOTO 6500
  73. 7300  RESTART.HH = VAL(LEFT$(TIME$,2))
  74. 7400  RESTART.MM = VAL(MID$(TIME$,4,2))
  75. 7500  RESTART.SS = VAL(RIGHT$(TIME$,2))
  76. 7600  IF NOT TRACE GOTO 8000
  77. 7700  LOCATE 21,67
  78. 7800  COLOR WHITE,BLACK
  79. 7900  PRINT "R:" RESTART.HH RESTART.MM RESTART.SS;
  80. 8000  CHANGE.HH = RESTART.HH-HALT.HH
  81. 8100  CHANGE.MM = RESTART.MM-HALT.MM
  82. 8200  CHANGE.SS = RESTART.SS-HALT.SS
  83. 8300  IF CHANGE.SS < 0 THEN CHANGE.SS = CHANGE.SS+60:CHANGE.MM = CHANGE.MM-1
  84. 8400  IF CHANGE.MM < 0 THEN CHANGE.MM = CHANGE.MM+60:CHANGE.HH = CHANGE.HH-1
  85. 8500  IF CHANGE.HH < 0 THEN CHANGE.HH = CHANGE.MM+24
  86. 8600  START.SS = START.SS+CHANGE.SS
  87. 8700  START.MM = START.MM+CHANGE.MM
  88. 8800  START.HH = START.HH+CHANGE.HH
  89. 8900  IF START.SS > 59 THEN START.SS = START.SS-60:START.MM = START.MM+1
  90. 9000  IF START.MM > 59 THEN START.MM = START.MM-60:START.HH = START.HH+1
  91. 9100  LOCATE 20,34
  92. 9200  COLOR BLACK,WHITE
  93. 9300  PRINT F1$;
  94. 9400  IF NOT TRACE GOTO 9800
  95. 9500  LOCATE 21,35
  96. 9600  COLOR WHITE,BLACK
  97. 9700  PRINT "S:" START.HH START.MM START.SS;
  98. 9800  GOTO 4000
  99. 9900  '
  100. 10000  ' Update Line Statistics Subroutine:
  101. 10100  '
  102. 10200  COLOR BLACK,WHITE
  103. 10300  LOCATE 23,36
  104. 10400  PRINT DATE$
  105. 10500  IF KEY.STROKES = 0 GOTO 10700
  106. 10600  ACCURACY = (KEY.STROKES-ERRORS)*100/KEY.STROKES
  107. 10700  LOCATE 22,72
  108. 10800  PRINT USING "###.##";ACCURACY
  109. 10900  HH = VAL(LEFT$(TIME$,2))
  110. 11000  MM = VAL(MID$(TIME$,4,2))
  111. 11100  SS = VAL(RIGHT$(TIME$,2))
  112. 11200  IF SS < START.SS THEN SS = SS+60:MM=MM-1
  113. 11300  IF MM < START.MM THEN MM = MM+60:HH=HH-1
  114. 11400  IF HH < START.HH THEN HH = HH+24
  115. 11500  TOTAL.SS = SS-START.SS
  116. 11600  TOTAL.SS = TOTAL.SS+60*(MM-START.MM)
  117. 11700  TOTAL.SS = TOTAL.SS+3600*(HH-START.HH)
  118. 11800  TOTAL.MM = TOTAL.SS/60
  119. 11900  TOTAL.HH = TOTAL.SS/3600
  120. 12000  WPM = WORDS/TOTAL.MM
  121. 12100  LOCATE 23,72
  122. 12200  PRINT USING "###.##";WPM
  123. 12300  IF NOT TRACE GOTO 12700
  124. 12400  LOCATE 21,12
  125. 12500  COLOR WHITE,BLACK
  126. 12600  PRINT USING "MINUTES: ###.##"; TOTAL.MM
  127. 12700  RETURN
  128. 12800  '
  129. 12900  ' Hit ENTER to go on Subroutine:
  130. 13000  '
  131. 13100  PRINT
  132. 13200  PRINT
  133. 13300  LOCATE ,33
  134. 13400  PRINT "Hit ";
  135. 13500  COLOR BLACK+BLINK,WHITE
  136. 13600  PRINT ENTER$;
  137. 13700  COLOR WHITE,BLACK
  138. 13800  PRINT " to go on";
  139. 13900  R = CSRLIN
  140. 14000  GOSUB 4000 'Wait for ENTER
  141. 14100  IF INK$ <> CR$ GOTO 14000
  142. 14200  COLOR WHITE,BLACK
  143. 14300  LOCATE R,1
  144. 14400  PRINT SPACE$(79)
  145. 14500  RETURN
  146. 14600  '
  147. 14700  ' Start doing things:
  148. 14800  '
  149. 14900  COLOR WHITE,BLACK
  150. 15000  CLS
  151. 15100  KEY OFF
  152. 15200  PLAY "mb ms l64"
  153. 15300  COLOR BLACK,WHITE
  154. 15400  LOCATE 1,1,0
  155. 15500  PRINT "PC-TOUCH " STRING$(28,"-");
  156. 15600  PRINT " Program to help you practice touch-typing"
  157. 15700  LOCATE 22,1
  158. 15800  PRINT "Keystrokes     0" SPACE$(42);
  159. 15900  PRINT "Accuracy     100.00 %"
  160. 16000  LOCATE 23,1
  161. 16100  PRINT "Errors         0" SPACE$(42);
  162. 16200  PRINT "Words/Minute   0.00  "
  163. 16300  LOCATE 22,37
  164. 16400  PRINT TIME$
  165. 16500  LOCATE 23,36
  166. 16600  PRINT DATE$
  167. 16700  R = 1
  168. 16800  COLOR WHITE,BLACK
  169. 16900  LOCATE 20,1
  170. 17000  PRINT "Hit ";
  171. 17100  COLOR BLACK,WHITE
  172. 17200  PRINT ENTER$;
  173. 17300  COLOR WHITE,BLACK
  174. 17400  PRINT " to go on";
  175. 17500  LOCATE ,30
  176. 17600  PRINT "Hit ";
  177. 17700  COLOR BLACK,WHITE
  178. 17800  PRINT F1$;
  179. 17900  COLOR WHITE,BLACK
  180. 18000  PRINT " to Halt/Restart";
  181. 18100  LOCATE ,65
  182. 18200  PRINT "Hit ";
  183. 18300  COLOR BLACK,WHITE
  184. 18400  PRINT ESC$;
  185. 18500  COLOR WHITE,BLACK
  186. 18600  PRINT " to stop"
  187. 18700  LOCATE R+3,6
  188. 18800  PRINT "This program  will display  on the screen  lines of";
  189. 18900  PRINT " text  for you to type."
  190. 19000  PRINT "You can't correct mistakes  as you go along,  because that";
  191. 19100  PRINT " won't help you learn"
  192. 19200  PRINT "how not to make them  in the first place.  Just do the best";
  193. 19300  PRINT " you can, and as you"
  194. 19400  PRINT "continue  you will find yourself  making fewer and  fewer";
  195. 19500  PRINT " errors.  And remember"
  196. 19600  PRINT "that when you are just learning to type, accuracy is more";
  197. 19700  PRINT " important than speed."
  198. 19800  FOR K = 1 TO 1
  199. 19900  KEY K,""
  200. 20000  NEXT K
  201. 20100  '
  202. 20200  ' FINDFILE -- Routine for dynamically allocating input files:
  203. 20300  '
  204. 20400  MAX.F = 0
  205. 20500  DIM FILENAME$(1),FILEID$(1)
  206. 20600  FILENAME$(0) = "pc-touch.fil"
  207. 20700  FOR F = 0 TO MAX.F
  208. 20800  FOR M = 0 TO 7
  209. 20900  MODE$ = CHR$(ASC("a")+M)
  210. 21000  FILEID$(F) = MODE$+":"+FILENAME$(F)
  211. 21100  ON ERROR GOTO 21500
  212. 21200  OPEN FILEID$(F) FOR INPUT AS #1
  213. 21300  ON ERROR GOTO 0
  214. 21400  GOTO 21900
  215. 21500  RESUME 21600
  216. 21600  NEXT M
  217. 21700  FILEID$(F) = ""
  218. 21800  GOTO 22000
  219. 21900  CLOSE #1
  220. 22000  NEXT F
  221. 22100  FOR F = 0 TO MAX.F
  222. 22200  IF FILEID$(F) <> "" GOTO 22700
  223. 22300  IF FINDFILE.FAILED GOTO 22600
  224. 22400  FINDFILE.FAILED = -1
  225. 22500  CLS
  226. 22600  PRINT "*** CAN'T FIND " FILENAME$(F) " FILE ***"
  227. 22700  NEXT F
  228. 22800  IF NOT FINDFILE.FAILED GOTO 23200
  229. 22900  PRINT
  230. 23000  PRINT "*** CHANGE DISKETTES AND TRY AGAIN ***"
  231. 23100  SYSTEM
  232. 23200  '
  233. 23300  ' End of FINDFILE Routine:
  234. 23400  '
  235. 23500  PRINT
  236. 23600  PRINT
  237. 23700  GOSUB 12800 'Hit ENTER to go on
  238. 23800  HALTABLE = Y
  239. 23900  COLOR WHITE,BLACK
  240. 24000  LOCATE 13,1
  241. 24100  PRINT SPACE$(79)
  242. 24200  LOCATE 12,21
  243. 24300  PRINT "TYPE THE FOLLOWING LINE EXACTLY AS SHOWN:"
  244. 24400  START.HH = VAL(LEFT$(TIME$,2))
  245. 24500  START.MM = VAL(MID$(TIME$,4,2))
  246. 24600  START.SS = VAL(RIGHT$(TIME$,2))
  247. 24700  IF NOT TRACE GOTO 25100
  248. 24800  LOCATE 21,35
  249. 24900  COLOR WHITE,BLACK
  250. 25000  PRINT "S:" START.HH START.MM START.SS
  251. 25100  '
  252. 25200  ' Open (or re-open) the input file:
  253. 25300  '
  254. 25400  OPEN FILEID$(0) FOR INPUT AS #1
  255. 25500  '
  256. 25600  ' Read the source file:
  257. 25700  '
  258. 25800  IF EOF(1) GOTO 34700
  259. 25900  LINE INPUT #1,RECORD$
  260. 26000  IF RECORD$ = "" GOTO 25800
  261. 26100  RC = 0<UNK! {0009}><UNK! {0009}><UNK! {0009}>      'Define Record Column within buffer
  262. 26200  CC = 41 - LEN(RECORD$)/2<UNK! {0009}>      'Define Cursor Column within display area
  263. 26300  COLOR WHITE+HILIT,BLACK
  264. 26400  LOCATE 14,1
  265. 26500  PRINT SPACE$(79)
  266. 26600  LOCATE 14,CC
  267. 26700  PRINT RECORD$
  268. 26800  LOCATE 16,1
  269. 26900  PRINT SPACE$(79)
  270. 27000  LOCATE 16,CC
  271. 27100  PRINT CURSOR$<UNK! {0009}>    'Print a cursor
  272. 27200  IN.A.WORD = N
  273. 27300  CC = CC - 1
  274. 27400  '
  275. 27500  ' Wait for a keystroke:
  276. 27600  '
  277. 27700  RC = RC + 1
  278. 27800  CC = CC + 1
  279. 27900  GOSUB 4000 'Wait for keystroke
  280. 28000  IF INK$ = CR$ GOTO 34200<UNK! {0009}><UNK! {0009}>     'ENTER key hit
  281. 28100  IF NO.MUSIC GOTO 28700
  282. 28200  IF INK$ < "A" OR  INK$ > "z" GOTO 28700
  283. 28300  IF INK$ > "Z" AND INK$ < "a" GOTO 28700
  284. 28400  N = ASC(INK$) - 65
  285. 28500  IF INK$ < "a" THEN N = N + 32
  286. 28600  PLAY "n=n;"
  287. 28700  '
  288. 28800  ' Display the character:
  289. 28900  '
  290. 29000  LOCATE 16,CC
  291. 29100  OUTK$ = MID$(RECORD$,RC,1)
  292. 29200  IF INK$ <> OUTK$ GOTO 29900
  293. 29300  COLOR WHITE+HILIT,BLACK
  294. 29400  PRINT INK$;
  295. 29500  GOTO 31000
  296. 29600  '
  297. 29700  ' Flag incorrect character:
  298. 29800  '
  299. 29900  COLOR BLACK+BLINK,WHITE
  300. 30000  PRINT INK$;
  301. 30100  ERRORS = ERRORS + 1
  302. 30200  COLOR BLACK,WHITE
  303. 30300  LOCATE 23,11
  304. 30400  PRINT USING "#####,";ERRORS
  305. 30500  IF NO.SOUND GOTO 31000
  306. 30600  BEEP
  307. 30700  '
  308. 30800  ' Update keystroke statistics:
  309. 30900  '
  310. 31000  COLOR WHITE+HILIT,BLACK
  311. 31100  LOCATE 16,CC+1
  312. 31200  PRINT CURSOR$<UNK! {0009}>   'Print a cursor
  313. 31300  KEY.STROKES = KEY.STROKES + 1
  314. 31400  COLOR BLACK,WHITE
  315. 31500  LOCATE 22,11
  316. 31600  PRINT USING "#####,";KEY.STROKES
  317. 31700  '
  318. 31800  ' See where we are syntactically:
  319. 31900  '
  320. 32000  IF OUTK$ >= "a" AND OUTK$ <= "z" GOTO 33100
  321. 32100  IF OUTK$ >= "A" AND OUTK$ <= "Z" GOTO 33100
  322. 32200  IF OUTK$ >= "0" AND OUTK$ <= "9" GOTO 33100
  323. 32300  '
  324. 32400  ' We're not in a word:
  325. 32500  '
  326. 32600  IN.A.WORD = N
  327. 32700  GOTO 34100
  328. 32800  '
  329. 32900  ' We're in a word:
  330. 33000  '
  331. 33100  IF IN.A.WORD GOTO 34100
  332. 33200  IN.A.WORD = Y
  333. 33300  WORDS = WORDS + 1
  334. 33400  IF NOT TRACE GOTO 34100
  335. 33500  LOCATE 21,1
  336. 33600  COLOR WHITE,BLACK
  337. 33700  PRINT "WORDS:" WORDS
  338. 33800  '
  339. 33900  ' Loop back to read next character:
  340. 34000  '
  341. 34100  GOTO 27700
  342. 34200  '
  343. 34300  ' End of line:
  344. 34400  '
  345. 34500  GOSUB 10200 'Update Line Statistics
  346. 34600  GOTO 25500 'Loop back to read next record
  347. 34700  '
  348. 34800  ' End of File Routine:
  349. 34900  '
  350. 35000  CLOSE #1
  351. 35100  FREE = FRE(" ")                   'Reorganize string space
  352. 35200  GOTO 25100<UNK! {0009}><UNK! {0009}><UNK! {0009}>'Loop back and re-open the file
  353. 35300  '
  354. 35400  ' User has hit the ESC key:
  355. 35500  '
  356. 35600  CLOSE #1
  357. 35700  '
  358. 35800  ' End of Program:
  359. 35900  '
  360. 36000  HALTABLE = N
  361. 36100  COLOR WHITE,BLACK
  362. 36200  FOR R = 2 TO 21
  363. 36300  LOCATE R,1
  364. 36400  PRINT SPACE$(79)
  365. 36500  NEXT R
  366. 36600  LOCATE 4,6
  367. 36700  PRINT "Thank you for using PC-TOUCH. Feel free to call me at ";
  368. 36800  PRINT "212/674-5848 any day"
  369. 36900  PRINT "between 9AM and 9PM to talk about:"
  370. 37000  PRINT ""
  371. 37100  PRINT ""
  372. 37200  PRINT TAB(11) "1) this program;"
  373. 37300  PRINT TAB(11) "2) the quotations I used;"
  374. 37400  PRINT TAB(11) "3) Bach's Chaconne in d-minor;"
  375. 37500  PRINT TAB(11) "4) dinosaurs in children's literature;"
  376. 37600  PRINT TAB(11) "5) anything that's made your life beautiful lately."
  377. 37700  PRINT
  378. 37800  PRINT
  379. 37900  PRINT TAB(21) "Sincerely,"
  380. 38000  PRINT
  381. 38100  PRINT TAB(21) "Dean Hannotte"
  382. 38200  PRINT TAB(21) "324 East Ninth Street" TAB(55) "(To return to DOS,"
  383. 38300  PRINT TAB(21) "New York, NY 10003"    TAB(57) "just hit ";
  384. 38400  LOCATE ,,0
  385. 38500  COLOR BLACK+BLINK,WHITE
  386. 38600  PRINT ENTER$;
  387. 38700  COLOR WHITE,BLACK
  388. 38800  PRINT ")"
  389. 38900  LOCATE 8,67:PRINT "\";:LOCATE ,69:PRINT "/"
  390. 39000  LOCATE 9,66:PRINT "-- --"
  391. 39100  LOCATE 10,67:PRINT "/";:LOCATE ,69:PRINT "\"
  392. 39200  COLOR WHITE+HILIT+BLINK,BLACK
  393. 39300  LOCATE 7,66:PRINT "*";:LOCATE ,70:PRINT "*"
  394. 39400  LOCATE 9,64:PRINT "*";:LOCATE ,72:PRINT "*"
  395. 39500  LOCATE 11,66:PRINT "*";:LOCATE ,70:PRINT "*"
  396. 39600  GOSUB 4000 'Wait for ENTER
  397. 39700  IF INK$ <> CR$ GOTO 39600
  398. 39800  COLOR WHITE,BLACK <UNK! {0009}>      'Scroll off the screen
  399. 39900  LOCATE 23,1<UNK! {0009}><UNK! {0009}>      'all but statistics lines.
  400. 40000  FOR X = 1 TO 21<UNK! {0009}><UNK! {0009}>      '(Must be 21 for BASCOM)
  401. 40100  PRINT
  402. 40200  NEXT X
  403. 40300  SYSTEM
  404.